package cn.kgc.controller;


import cn.kgc.config.WechatConfig;
import cn.kgc.dto.UsersDto;
import cn.kgc.service.UsersService;
import cn.kgc.utils.UrlUtils;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Map;

/**
 * <p>
 * 用户 前端控制器
 * </p>
 *
 * @author fsw
 * @since 2021-08-04
 */
@Slf4j
@RestController
@RequestMapping("/api/user")
public class UsersController {

    //1.微信的帮助类，为了获取yml中的属性
    private final WechatConfig wechatConfig;

    private final UsersService usersService;

    public UsersController(WechatConfig wechatConfig, UsersService usersService) {
        this.wechatConfig = wechatConfig;
        this.usersService = usersService;
    }

    //第一次访问微信，获取code
    @GetMapping("login/wechat")
    public void loginWeChat(HttpServletResponse response){
        String url = wechatConfig.getOpen_url() +
                "?appid=" + wechatConfig.getAppid() +
                "&redirect_uri=" + wechatConfig.getRedirect_uri() +
                "&response_type=" + wechatConfig.getResponse_type() +
                "&scope=" + wechatConfig.getScope() +
                "&state=" + wechatConfig.getState();
        //向微信发送这个url
        try {
            response.sendRedirect(url);
        } catch (IOException e) {
            log.error("向微信发送第一次请求异常");
        }
    }

    //微信访问我们的方法  redirect_uri
    @GetMapping("wechat/callback")
    public void callback(String code, HttpServletResponse response){
        log.info("微信给我们的code:{}",code);
        // 1.拿到这个code是为了获取access_token(微信给我们的一个临时令牌)和 openid(相当于是微信用户的id)
        String url = "https://api.weixin.qq.com/sns/oauth2/access_token" +
                "?appid=" + wechatConfig.getAppid() +
                "&secret=" + wechatConfig.getSecret() +
                "&code=" + code +
                "&grant_type=authorization_code";
        //1.2 第二次访问微信，获取结果
        String resultJson = UrlUtils.loadURL(url);
        //1.3 将这个json对象转换成Map
        Map <String, Object>map = JSON.parseObject(resultJson, Map.class);
        String access_token = map.get("access_token").toString();
        String openid = map.get("openid").toString();
        log.info("第二次访问微信获取的结果:{}", resultJson);
        //2.判断用户是不是第一次扫码
        //如果是第一次扫码，获取用户的信息，存到mysql数据库中
        //如果不是第一次扫码
        UsersDto usersDto = usersService.loginWeChat(access_token, openid);

        //3.颁发token  这个位置name都可以不给，前端的需求，可以不要，下次查询让他通过token
        String token = usersDto.getToken();
        String name = usersDto.getUserName();

        //4.跳转到首页
        try {
            response.sendRedirect(wechatConfig.getSuccess_url() + "?token=" + token + "&userInfo=" + URLEncoder.encode(name, "UTF-8"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

